Python ๋ฉํฐํ๋ก์ธ์ฑ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์ฌ์ธต ๋ถ์. Value, Array, Manager ๊ฐ์ฒด์ ์ฐจ์ด์ ๊ณผ ์ต์ ์ ์ฑ๋ฅ์ ์ํด ๊ฐ๊ฐ์ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์ง ์์๋ด ๋๋ค.
๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฅ๋ ฅ ํด๋ฐฉ: Python ๋ฉํฐํ๋ก์ธ์ฑ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ธต ๋ถ์
๋ฉํฐ์ฝ์ด ํ๋ก์ธ์ ์๋์ ์์
์ ๋ณ๋ ฌ๋ก ์ํํ ์ ์๋ ์ํํธ์จ์ด๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ ์ด์ ํ์ ๊ธฐ์ ์ด ์๋๋ผ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ธ ์์์
๋๋ค. Python์ multiprocessing
๋ชจ๋์ ์ด๋ฌํ ์ฝ์ด๋ฅผ ํ์ฉํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๊ทผ๋ณธ์ ์ธ ๊ณผ์ ๋ฅผ ์๊ณ ์์ต๋๋ค. ํ๋ก์ธ์ค๋ ์ค๊ณ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ์ง ์์ต๋๋ค. ๊ฐ ํ๋ก์ธ์ค๋ ์์ฒด ๊ฒฉ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ์๋ํ๋ฉฐ, ์ด๋ ์์ ์ฑ๊ณผ ์์ ์ฑ์๋ ์ข์ง๋ง ํต์ ํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํด์ผ ํ ๋ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
์ด ์ง์ ์์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฑ์ฅํฉ๋๋ค. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๋๋ก ํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ตํ ๋ฐ ์กฐ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. multiprocessing
๋ชจ๋์ ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒ์ Value
, Array
, ๊ทธ๋ฆฌ๊ณ ๋ค์ฌ๋ค๋ฅํ Manager
๊ฐ์ฒด์
๋๋ค. ์ด ๋๊ตฌ๋ค ๊ฐ์ ์ฐจ์ด์ ์ ์ดํดํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์๋ชป๋ ๋๊ตฌ๋ฅผ ์ ํํ๋ฉด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด๋ ์ง๋์น๊ฒ ๋ณต์กํ ์ฝ๋๋ก ์ด์ด์ง ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด ๊ฐ์ด๋์์๋ ์ด ์ธ ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ ์์ธํ ์ดํด๋ณด๊ณ , ๋ช ํํ ์์์ ํจ๊ป ํน์ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ ๊ฒ์ ๊ฒฐ์ ํ๊ธฐ ์ํ ์ค์ฉ์ ์ธ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฉํฐํ๋ก์ธ์ฑ์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ์ดํดํ๊ธฐ
๋๊ตฌ๋ฅผ ์ดํด๋ณด๊ธฐ ์ ์, ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ๋ค์ ์ ํ์๋ก ํ๋์ง ํ์
ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. multiprocessing
์ ์ฌ์ฉํ์ฌ ์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ ๋, ์ด์ ์ฒด์ ๋ ํด๋น ํ๋ก์ธ์ค์ ์์ ํ ๋ถ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํฉ๋๋ค. ํ๋ก์ธ์ค ๊ฒฉ๋ฆฌ๋ผ๊ณ ์๋ ค์ง ์ด ๊ฐ๋
์ ํ ํ๋ก์ธ์ค์ ๋ณ์๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋์ผํ ์ด๋ฆ์ ๋ณ์์ ์์ ํ ๋
๋ฆฝ์ ์ด๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ด๋ ๋์ผํ ํ๋ก์ธ์ค ๋ด์ ์ค๋ ๋๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ ๋ฉํฐ์ค๋ ๋ฉ๊ณผ๋ ์ฃผ์ํ ์ฐจ์ด์ ์ ๋๋ค. ๊ทธ๋ฌ๋ Python์์ ์ ์ญ ์ธํฐํ๋ฆฌํฐ ๋ฝ(GIL)์ ์ข ์ข ์ค๋ ๋๊ฐ CPU ๋ฐ์ด๋ ์์ ์ ๋ํด ์ง์ ํ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๋ฌ์ฑํ๋ ๊ฒ์ ๋ฐฉํดํ๋ฏ๋ก, ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์๋ ๋ฉํฐํ๋ก์ธ์ฑ์ด ์ ํธ๋๋ ์ ํ์ ๋๋ค. ๊ทธ ๋๊ฐ๋ก, ์ฐ๋ฆฌ๋ ํ๋ก์ธ์ค ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ์ ๋ช ์์ ์ผ๋ก ์ง์ ํด์ผ ํฉ๋๋ค.
๋ฐฉ๋ฒ 1: ๋จ์ ํ๋ฆฌ๋ฏธํฐ๋ธ - Value
๋ฐ Array
multiprocessing.Value
์ multiprocessing.Array
๋ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๊ฐ์ฅ ์ง์ ์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ด๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด์ ์ฒด์ ์ ์ํด ๊ด๋ฆฌ๋๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์๋ ์ ์์ค C ๋ฐ์ดํฐ ํ์
์ ๋ํผ์
๋๋ค. ์ด๋ฌํ ์ง์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๋ฐฉ์์ด ์ด๋ค์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ง๋ญ๋๋ค.
multiprocessing.Value
๋ก ๋จ์ผ ๋ฐ์ดํฐ ์กฐ๊ฐ ๊ณต์ ํ๊ธฐ
์ด๋ฆ์์ ์ ์ ์๋ฏ์ด, Value
๋ ์ ์, float ๋๋ ๋ถ๋ฆฌ์ธ๊ณผ ๊ฐ์ ๋จ์ผ ์์ ๊ฐ์ ๊ณต์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. Value
๋ฅผ ์์ฑํ ๋ C ๋ฐ์ดํฐ ํ์
์ ํด๋นํ๋ ํ์
์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ํ์
์ ์ง์ ํด์ผ ํฉ๋๋ค.
์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํค๋ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
import multiprocessing
def worker(shared_counter, lock):
for _ in range(10000):
# Use a lock to prevent race conditions
with lock:
shared_counter.value += 1
if __name__ == "__main__":
# 'i' for signed integer, 0 is the initial value
counter = multiprocessing.Value('i', 0)
lock = multiprocessing.Lock()
processes = []
for _ in range(10):
p = multiprocessing.Process(target=worker, args=(counter, lock))
processes.append(p)
p.start()
for p in processes:
p.join()
print(f"Final counter value: {counter.value}")
# Expected output: Final counter value: 100000
ํต์ฌ ์ฌํญ:
- ํ์
์ฝ๋: ๋ถํธ ์๋ ์ ์์๋
'i'
๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ์ฝ๋๋ก๋ ๋ฐฐ์ ๋ฐ๋ float๋ฅผ ์ํ'd'
์ ๋จ์ผ ๋ฌธ์๋ฅผ ์ํ'c'
๊ฐ ์์ต๋๋ค. .value
์์ฑ: ๊ธฐ๋ณธ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ๋ ค๋ฉด.value
์์ฑ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.- ์๋ ๋๊ธฐํ:
multiprocessing.Lock
์ฌ์ฉ์ ์ฃผ๋ชฉํ์ญ์์ค. ์ ๊ธ(lock)์ด ์์ผ๋ฉด ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ์นด์ดํฐ ๊ฐ์ ์ฝ๊ณ , ์ฆ๊ฐ์ํค๊ณ , ๋์์ ๋ค์ ์ธ ์ ์์ด ์ผ๋ถ ์ฆ๊ฐ๊ฐ ์์ค๋๋ ๊ฒฝ์ ์กฐ๊ฑด์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.Value
์Array
๋ ์๋ ๋๊ธฐํ๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก, ์ง์ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
multiprocessing.Array
๋ก ๋ฐ์ดํฐ ์ปฌ๋ ์
๊ณต์ ํ๊ธฐ
Array
๋ Value
์ ์ ์ฌํ๊ฒ ์๋ํ์ง๋ง, ๋จ์ผ ์์ ํ์
์ ๊ณ ์ ํฌ๊ธฐ ๋ฐฐ์ด์ ๊ณต์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ซ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๋ฐ ๋งค์ฐ ํจ์จ์ ์ด๋ฏ๋ก ๊ณผํ ๋ฐ ๊ณ ์ฑ๋ฅ ์ปดํจํ
์์ ํ์์ ์
๋๋ค.
import multiprocessing
def square_elements(shared_array, lock, start_index, end_index):
for i in range(start_index, end_index):
# A lock isn't strictly needed here if processes work on different indices,
# but it's crucial if they might modify the same index.
with lock:
shared_array[i] = shared_array[i] * shared_array[i]
if __name__ == "__main__":
# 'i' for signed integer, initialized with a list of values
initial_data = list(range(10))
shared_arr = multiprocessing.Array('i', initial_data)
lock = multiprocessing.Lock()
p1 = multiprocessing.Process(target=square_elements, args=(shared_arr, lock, 0, 5))
p2 = multiprocessing.Process(target=square_elements, args=(shared_arr, lock, 5, 10))
p1.start()
p2.start()
p1.join()
p2.join()
print(f"Final array: {list(shared_arr)}")
# Expected output: Final array: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
ํต์ฌ ์ฌํญ:
- ๊ณ ์ ํฌ๊ธฐ ๋ฐ ํ์
: ํ๋ฒ ์์ฑ๋
Array
์ ํฌ๊ธฐ์ ๋ฐ์ดํฐ ํ์ ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. - ์ง์ ์ธ๋ฑ์ฑ: ํ์ค ๋ฆฌ์คํธ์ ๊ฐ์ ์ธ๋ฑ์ฑ(์:
shared_arr[i]
)์ ์ฌ์ฉํ์ฌ ์์๋ฅผ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ต๋๋ค. - ๋๊ธฐํ ์ฃผ์: ์ ์์์์๋ ๊ฐ ํ๋ก์ธ์ค๊ฐ ๋ฐฐ์ด์ ๊ฐ๋ณ์ ์ด๊ณ ๊ฒน์น์ง ์๋ ์ฌ๋ผ์ด์ค์์ ์๋ํ๋ฏ๋ก ์ ๊ธ์ด ๋ถํ์ํด ๋ณด์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ์ธ๋ฑ์ค์ ์ธ ๊ฐ๋ฅ์ฑ์ด ์๊ฑฐ๋, ํ ํ๋ก์ธ์ค๊ฐ ์ผ๊ด๋ ์ํ๋ฅผ ์ฝ์ด์ผ ํ๋ ๋์์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ฐ๊ณ ์๋ค๋ฉด, ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ๊ธ์ ์ ๋์ ์ผ๋ก ํ์์ ์ ๋๋ค.
Value
๋ฐ Array
์ ์ฅ๋จ์
- ์ฅ์ :
- ๊ณ ์ฑ๋ฅ: ์ต์ํ์ ์ค๋ฒํค๋์ ์ง์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ค.
- ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ ์จ: ์์ ํ์ ์ ๋ํ ํจ์จ์ ์ธ ์ ์ฅ ๊ณต๊ฐ์ ์ ๊ณตํฉ๋๋ค.
- ๋จ์ :
- ์ ํ๋ ๋ฐ์ดํฐ ํ์ : ๊ฐ๋จํ C ํธํ ๋ฐ์ดํฐ ํ์ ๋ง ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. Python ๋์ ๋๋ฆฌ, ๋ฆฌ์คํธ ๋๋ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ฅผ ์ง์ ์ ์ฅํ ์ ์์ต๋๋ค.
- ์๋ ๋๊ธฐํ: ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ๊ธ(lock)์ ๊ตฌํํ ์ฑ ์์ด ์์ผ๋ฉฐ, ์ด๋ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
- ์ ์ฐ์ฑ ๋ถ์กฑ:
Array
๋ ๊ณ ์ ๋ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋๋ค.
๋ฐฉ๋ฒ 2: ์ ์ฐํ ํต์ฌ - Manager
๊ฐ์ฒด
๊ตฌ์ฑ ๋์
๋๋ฆฌ๋ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ์ ๊ฐ์ ๋ ๋ณต์กํ Python ๊ฐ์ฒด๋ฅผ ๊ณต์ ํด์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ๋ฐ๋ก ์ด ์ง์ ์์ multiprocessing.Manager
๊ฐ ๋น์ ๋ฐํฉ๋๋ค. Manager๋ ํ๋ก์ธ์ค ๊ฐ์ ํ์ค Python ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ ์ ์๋ ๊ณ ์์ค์ ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
Manager ๊ฐ์ฒด์ ์๋ ๋ฐฉ์: ์๋ฒ ํ๋ก์ธ์ค ๋ชจ๋ธ
์ง์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ Value
๋ฐ Array
์ ๋ฌ๋ฆฌ, Manager
๋ ๋ค๋ฅด๊ฒ ์๋ํฉ๋๋ค. Manager๋ฅผ ์์ํ๋ฉด ํน๋ณํ ์๋ฒ ํ๋ก์ธ์ค๊ฐ ์คํ๋ฉ๋๋ค. ์ด ์๋ฒ ํ๋ก์ธ์ค๋ ์ค์ Python ๊ฐ์ฒด(์: ์ค์ ๋์
๋๋ฆฌ)๋ฅผ ๋ณด์ ํฉ๋๋ค.
๋ค๋ฅธ ์์
์ ํ๋ก์ธ์ค๋ ์ด ๊ฐ์ฒด์ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋์ , ํน๋ณํ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ต๋๋ค. ์์
์ ํ๋ก์ธ์ค๊ฐ ํ๋ก์์ ๋ํ ์์
์ ์ํํ ๋(์: shared_dict['key'] = 'value'
), ๋ด๋ถ์ ์ผ๋ก ๋ค์์ด ๋ฐ์ํฉ๋๋ค.
- ๋ฉ์๋ ํธ์ถ๊ณผ ์ธ์๊ฐ ์ง๋ ฌํ๋ฉ๋๋ค(ํผํด๋ง).
- ์ด ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ ์ฐ๊ฒฐ(ํ์ดํ ๋๋ ์์ผ๊ณผ ๊ฐ์)์ ํตํด Manager์ ์๋ฒ ํ๋ก์ธ์ค๋ก ์ ์ก๋ฉ๋๋ค.
- ์๋ฒ ํ๋ก์ธ์ค๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ง๋ ฌํํ๊ณ ์ค์ ๊ฐ์ฒด์ ๋ํ ์์ ์ ์คํํฉ๋๋ค.
- ์์ ์ด ๊ฐ์ ๋ฐํํ๋ฉด, ํด๋น ๊ฐ์ ์ง๋ ฌํ๋์ด ์์ ์ ํ๋ก์ธ์ค๋ก ๋ค์ ์ ์ก๋ฉ๋๋ค.
๊ฒฐ์ ์ ์ผ๋ก, Manager ํ๋ก์ธ์ค๋ ํ์ํ ๋ชจ๋ ์ ๊ธ ๋ฐ ๋๊ธฐํ๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค๊ณ ๊ฒฝ์ ์กฐ๊ฑด ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ค์ฌ์ฃผ์ง๋ง, ํต์ ๋ฐ ์ง๋ ฌํ ์ค๋ฒํค๋๋ก ์ธํด ์ฑ๋ฅ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค.
๋ณต์กํ ๊ฐ์ฒด ๊ณต์ : Manager.dict()
๋ฐ Manager.list()
์นด์ดํฐ ์์๋ฅผ ๋ค์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ์๋ Manager.dict()
๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์นด์ดํฐ๋ฅผ ์ ์ฅํ ๊ฒ์
๋๋ค.
import multiprocessing
def worker(shared_dict, worker_id):
# Each worker has its own key in the dictionary
key = f'worker_{worker_id}'
shared_dict[key] = 0
for _ in range(1000):
shared_dict[key] += 1
if __name__ == "__main__":
with multiprocessing.Manager() as manager:
# The manager creates a shared dictionary
shared_data = manager.dict()
processes = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(shared_data, i))
processes.append(p)
p.start()
for p in processes:
p.join()
print(f"Final shared dictionary: {dict(shared_data)}")
# Expected output might look like:
# Final shared dictionary: {'worker_0': 1000, 'worker_1': 1000, 'worker_2': 1000, 'worker_3': 1000, 'worker_4': 1000}
ํต์ฌ ์ฌํญ:
- ์๋ ์ ๊ธ ์์:
Lock
๊ฐ์ฒด๊ฐ ์๋ ๊ฒ์ ์ฃผ๋ชฉํ์ญ์์ค. Manager์ ํ๋ก์ ๊ฐ์ฒด๋ ์ค๋ ๋ ์์ ํ๋ฉฐ ํ๋ก์ธ์ค ์์ ํ์ฌ ๋๊ธฐํ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. - ํ์ด์ฌ์ค๋ฌ์ด ์ธํฐํ์ด์ค: ์ผ๋ฐ์ ์ธ Python ๋์
๋๋ฆฌ ๋ฐ ๋ฆฌ์คํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก
manager.dict()
๋ฐmanager.list()
์ ์ํธ ์์ฉํ ์ ์์ต๋๋ค. - ์ง์๋๋ ํ์
: Manager๋
list
,dict
,Namespace
,Lock
,Event
,Queue
๋ฑ์ ๊ณต์ ๋ฒ์ ์ ์์ฑํ ์ ์์ด ๋๋ผ์ด ๋ค์ฉ์ฑ์ ์ ๊ณตํฉ๋๋ค.
Manager
๊ฐ์ฒด์ ์ฅ๋จ์
- ์ฅ์ :
- ๋ณต์กํ ๊ฐ์ฒด ์ง์: ํผํด๋ง(pickling) ๊ฐ๋ฅํ ๊ฑฐ์ ๋ชจ๋ ํ์ค Python ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค.
- ์๋ ๋๊ธฐํ: ๋ด๋ถ์ ์ผ๋ก ์ ๊ธ์ ์ฒ๋ฆฌํ์ฌ ์ฝ๋๋ฅผ ๋ ๊ฐ๋จํ๊ณ ์์ ํ๊ฒ ๋ง๋ญ๋๋ค.
- ๋์ ์ ์ฐ์ฑ: ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ผ ์ ์๋ ๋ฆฌ์คํธ ๋ฐ ๋์ ๋๋ฆฌ์ ๊ฐ์ ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ง์ํฉ๋๋ค.
- ๋จ์ :
- ๋ฎ์ ์ฑ๋ฅ: ์๋ฒ ํ๋ก์ธ์ค, ํ๋ก์ธ์ค ๊ฐ ํต์ (IPC) ๋ฐ ๊ฐ์ฒด ์ง๋ ฌํ์ ์ค๋ฒํค๋๋ก ์ธํด
Value
/Array
๋ณด๋ค ์๋นํ ๋๋ฆฝ๋๋ค. - ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: Manager ํ๋ก์ธ์ค ์์ฒด๊ฐ ๋ฆฌ์์ค๋ฅผ ์๋นํฉ๋๋ค.
- ๋ฎ์ ์ฑ๋ฅ: ์๋ฒ ํ๋ก์ธ์ค, ํ๋ก์ธ์ค ๊ฐ ํต์ (IPC) ๋ฐ ๊ฐ์ฒด ์ง๋ ฌํ์ ์ค๋ฒํค๋๋ก ์ธํด
๋น๊ตํ: Value
/Array
๋ Manager
ํน์ง | Value / Array |
Manager |
---|---|---|
์ฑ๋ฅ | ๋งค์ฐ ๋์ | ๋ฎ์ (IPC ์ค๋ฒํค๋๋ก ์ธํด) |
๋ฐ์ดํฐ ํ์ | ์์ C ํ์ (์ ์, ์ค์ ๋ฑ) | ํ๋ถํ Python ๊ฐ์ฒด (dict, list ๋ฑ) |
์ฌ์ฉ ํธ์์ฑ | ๋ฎ์ (์๋ ์ ๊ธ ํ์) | ๋์ (๋๊ธฐํ ์๋) |
์ ์ฐ์ฑ | ๋ฎ์ (๊ณ ์ ํฌ๊ธฐ, ๋จ์ ํ์ ) | ๋์ (๋์ , ๋ณตํฉ ๊ฐ์ฒด) |
๊ธฐ๋ฐ ๋ฉ์ปค๋์ฆ | ์ง์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก | ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง ์๋ฒ ํ๋ก์ธ์ค |
์ต์ ์ ์ฌ์ฉ ์ฌ๋ก | ์์น ์ฐ์ฐ, ์ด๋ฏธ์ง ์ฒ๋ฆฌ, ๋จ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์ฑ๋ฅ ์ค์ ์์ . | ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๊ณต์ , ๊ตฌ์ฑ, ๋ณตํฉ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์์ ์กฐ์ . |
์ค์ฉ์ ๊ฐ์ด๋: ์ธ์ ๋ฌด์์ ์ฌ์ฉํ ๊น?
์ฌ๋ฐ๋ฅธ ๋๊ตฌ๋ฅผ ์ ํํ๋ ๊ฒ์ ์ฑ๋ฅ๊ณผ ํธ์์ฑ ์ฌ์ด์ ๊ณ ์ ์ ์ธ ์์ง๋์ด๋ง ์ ์ถฉ์ ๋๋ค. ๋ค์์ ๊ฐ๋จํ ์์ฌ ๊ฒฐ์ ํ๋ ์์ํฌ์ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ Value
๋๋ Array
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ์ฑ๋ฅ์ด ์ต์ฐ์ ๊ณ ๋ ค ์ฌํญ์ธ ๊ฒฝ์ฐ. ๊ณผํ ์ปดํจํ , ๋ฐ์ดํฐ ๋ถ์ ๋๋ ์ค์๊ฐ ์์คํ ๊ณผ ๊ฐ์ด ๋ชจ๋ ๋ง์ดํฌ๋ก์ด๊ฐ ์ค์ํ ๋๋ฉ์ธ์์ ์์ ํ๊ณ ์์ต๋๋ค.
- ๋จ์ํ ์ซ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๊ฒฝ์ฐ. ์ฌ๊ธฐ์๋ ์นด์ดํฐ, ํ๋๊ทธ, ์ํ ํ์๊ธฐ ๋๋ ๋๊ท๋ชจ ์ซ์ ๋ฐฐ์ด(์: NumPy์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ฒ๋ฆฌ๋ฅผ ์ํ)์ด ํฌํจ๋ฉ๋๋ค.
- ์ ๊ธ(lock) ๋๋ ๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ฌ์ฉํ ์๋ ๋๊ธฐํ์ ํ์์ฑ์ ์ดํดํ๊ณ ์ด์ ์ต์ํ ๊ฒฝ์ฐ.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ Manager
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ๊ฐ๋ฐ ์ฉ์ด์ฑ๊ณผ ์ฝ๋ ๊ฐ๋ ์ฑ์ด ์์ํ ์๋๋ณด๋ค ๋ ์ค์ํ ๊ฒฝ์ฐ.
- ๋์ ๋๋ฆฌ, ๋ฌธ์์ด ๋ฆฌ์คํธ ๋๋ ์ค์ฒฉ ๊ฐ์ฒด์ ๊ฐ์ ๋ณต์กํ๊ฑฐ๋ ๋์ ์ธ Python ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ณต์ ํด์ผ ํ๋ ๊ฒฝ์ฐ.
- ๊ณต์ ๋๋ ๋ฐ์ดํฐ๊ฐ ๊ทน๋๋ก ๋์ ๋น๋๋ก ์ ๋ฐ์ดํธ๋์ง ์์ผ๋ฉฐ, ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ๋ถํ์ ๋ํด IPC์ ์ค๋ฒํค๋๊ฐ ํ์ฉ ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ ๋๋ค.
- ๊ตฌ์ฑ ๋์ ๋๋ฆฌ ๋๋ ๊ฒฐ๊ณผ ํ์ ๊ฐ์ด ํ๋ก์ธ์ค๊ฐ ๊ณตํต ์ํ๋ฅผ ๊ณต์ ํด์ผ ํ๋ ์์คํ ์ ๊ตฌ์ถํ๋ ๊ฒฝ์ฐ.
๋์์ ๋ํ ์ฐธ๊ณ ์ฌํญ
๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ๊ฐ๋ ฅํ ๋ชจ๋ธ์ด์ง๋ง, ํ๋ก์ธ์ค๊ฐ ํต์ ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋๋๋ค. multiprocessing
๋ชจ๋์ Queue
๋ฐ Pipe
์ ๊ฐ์ ๋ฉ์์ง ์ ๋ฌ ๋ฉ์ปค๋์ฆ๋ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋ ํ๋ก์ธ์ค๊ฐ ๊ณตํต ๋ฐ์ดํฐ ๊ฐ์ฒด์ ์ ๊ทผํ๋ ๋์ , ๊ฐ๋ณ ๋ฉ์์ง๋ฅผ ์ก์์ ํฉ๋๋ค. ์ด๋ ์ข
์ข
๋ ๊ฐ๋จํ๊ณ ๋ ๊ฒฐํฉ๋ ๋์์ธ์ผ๋ก ์ด์ด์ง ์ ์์ผ๋ฉฐ, ์์ฐ์-์๋น์ ํจํด์ด๋ ํ์ดํ๋ผ์ธ ๋จ๊ณ ๊ฐ์ ์์
์ ์ ๋ฌํ๋ ๋ฐ ๋ ์ ํฉํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
Python์ multiprocessing
๋ชจ๋์ ๋ณ๋ ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ํดํท์ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ ๊ดํด์๋ ์ ์์ค ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๊ณ ์์ค ์ถ์ํ ์ฌ์ด์ ์ ํ์ด ๊ทผ๋ณธ์ ์ธ ์ ์ถฉ์ ์ ์ ์ํฉ๋๋ค.
Value
๋ฐArray
๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผ์ ์ ๊ณตํ์ฌ ํ์ํ ์๋๋ฅผ ์ ๊ณตํ๋ฏ๋ก, ๋จ์ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ์์ ํ๋ ์ฑ๋ฅ ๋ฏผ๊ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์์ ์ธ ์ ํ์ ๋๋ค.Manager
๊ฐ์ฒด๋ ์๋ ๋๊ธฐํ๋ฅผ ํตํด ๋ณต์กํ Python ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ ์ ์๊ฒ ํจ์ผ๋ก์จ ๋ฐ์ด๋ ์ ์ฐ์ฑ๊ณผ ์ฌ์ฉ ํธ์์ฑ์ ์ ๊ณตํ์ง๋ง, ์ฑ๋ฅ ์ค๋ฒํค๋๋ผ๋ ๋น์ฉ์ด ๋ฐ๋ฆ ๋๋ค.
์ด ํต์ฌ์ ์ธ ์ฐจ์ด์ ์ ์ดํดํจ์ผ๋ก์จ, ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ ๋ฟ๋ง ์๋๋ผ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์ฌ๋ฐ๋ฅธ ๋๊ตฌ๋ฅผ ์ ํํ๋ ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค. ํต์ฌ์ ๊ณต์ ํ๋ ๋ฐ์ดํฐ์ ์ ํ, ์ ๊ทผ ๋น๋, ์ฑ๋ฅ ์๊ตฌ ์ฌํญ๊ณผ ๊ฐ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ถ์ํ์ฌ Python์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์ง์ ํ ํ์ ๋ฐํํ๋ ๊ฒ์ ๋๋ค.